package com.second.app.superthread;

import java.util.concurrent.CountDownLatch;

/**
 * @Author GYZ
 * @Date 2024/1/18
 * <pre>
 *
 * </pre>
 */


//案例1  此案例虽然运行成功，但是并不能保证在main线程中执行了service.downMethod()时，所有的工作线程都是
//      wait状态，因为某些线程可能有准备的时间花费比较长，可能用时耗时时间超过2s，这时候如果在第2s就调用service.downMethod();
//      方法达不到唤醒所有线程继续向下运行的目的，也就是相当于裁判员没有等全部的运动员到来时，就让发令枪开始比赛了。这是不准确的
    //程序运行结果如下：
//   Thread-1准备
//           Thread-4准备
//           Thread-3准备
//           Thread-2准备
//           Thread-7准备
//           Thread-8准备
//           Thread-0准备
//           Thread-9准备
//           Thread-5准备
//           Thread-6准备
//           开始
//           Thread-1结束
//           Thread-8结束
//           Thread-7结束
//           Thread-2结束
//           Thread-3结束
//           Thread-4结束
//           Thread-5结束
//           Thread-6结束
//           Thread-9结束
//           Thread-0结束
class ThisService{

    CountDownLatch countDownLatch = new CountDownLatch(1);

    public void testMethod(){
        try {
            System.out.println(Thread.currentThread().getName()+"准备");
            countDownLatch.await();
            System.out.println(Thread.currentThread().getName()+"结束");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void downMethod(){
        System.out.println(" 开始");
        countDownLatch.countDown();
    }

}

class ThisThread extends Thread{

    private final ThisService thisService;

    public ThisThread(ThisService thisService){
       this.thisService = thisService;
    }

    @Override
    public void run() {
        thisService.testMethod();
    }
}


public class CountDownLatchDemoRun {

    public static void main(String[] args) throws InterruptedException {
        ThisService thisService = new ThisService();
        ThisThread[] tArray =new ThisThread[10];
        for (int i=0;i<tArray.length;i++){
            tArray[i]=new ThisThread(thisService);
            tArray[i].start();
        }
        Thread.sleep(2000);
        thisService.downMethod();
    }
}

